home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
dev
/
lang
/
DynamicDemo_PAS.lha
/
Dynamic_Demo.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-09-25
|
28KB
|
649 lines
{*******************************************************************}
{ DynamicLists V1.2 }
{*******************************************************************}
{ Een demonstratie hoe je met dynamic lists kunt werken. }
{*******************************************************************}
{ Door Hans Luyten }
{ }
{ Compiler: HiSpeed Pascal v2.0 (Amiga) }
{ (Werkt ook foutloos met: Turbo Pascal >v5.5 (MSDos) }
{ en: HiSpeed Pascal >v2.4 (Atari)) }
{ HiSpeed Pascal: (c) 1992 HiSoft }
{ Turbo Pascal: (c) 1991 Borland }
{ }
{ Remark: VGAHi wordt door de Amiga en Atari ondersteunt !! }
{ }
{ Compiler options: Range Check, Stack Check, I/O Check }
{ }
{*******************************************************************}
{ Versie: 1.0, 17 September 1993. }
{ }
{ Versie: 1.1, 18 September 1993, Toevoeging: Delete Node, }
{ Position Insert. }
{ Versie: 1.2, 19 September 1993, Bug removed bij 'Delete' en }
{ 'positionInsert', tevens index- }
{ balk voor nodenummering }
{ toegevoegd }
{*******************************************************************}
PROGRAM DynamicLists;
uses
Graph,Crt;
TYPE { Onze LINKEDLIST }
StudentP = ^StudentData;
StudentData = RECORD
Naam : string[10];
ANr : string[10];
Next : StudentP;
END;
CONST
CX = 8; { Karakter afstand }
CY = 8; { Regel afstand }
FormH = 20; { Node Hoogte }
FormW = 95; { Node Breedte }
Dist = 5; { Block afstand }
MaxNodes= 5; { Maximum Nodes }
VAR
StudentHead : StudentP;
VGAMode : BOOLEAN;
c : CHAR;
OldPalette : PaletteType;
ActiveNodes : INTEGER;
{*******************************************************************}
{************************* Alg-Procedures **************************}
{*******************************************************************}
{*******************************************************************}
{ FixBar(x,y,x2,y2,Color1,Color2); }
{ Vervangt SetColor, SetFillStyle en Bar in 1 procedure. }
{*******************************************************************}
{ PRE : VGAMode }
{ POST : Bar getekend. }
{*******************************************************************}
PROCEDURE FixBar(x,y,x2,y2 : INTEGER; color1, color2 : INTEGER);
BEGIN
SetColor(Color1);
SetFillStyle(SolidFill,Color2);
Bar(x,y,x2,y2);
END;
{*******************************************************************}
{ LeesInput(x,y,'Naam:',String); }
{ Leest het keyboard tijdens grafisch scherm (ReadLn geeft probleem)}
{ van maximaal 10 tekens ! }
{*******************************************************************}
{ PRE : VGAMode=TRUE }
{ POST : In String staat de input. }
{*******************************************************************}
PROCEDURE LeesInput(x,y: INTEGER; header : String;
VAR TEXT : String);
CONST
MaxLengte = 10;
VAR
Letter : CHAR;
Teller : INTEGER;
BEGIN
OutTextXY(x+CX,y+CY,header);
TEXT:='';
FOR Teller:=1 TO MaxLengte DO
BEGIN
Letter:=ReadKey;
IF ((Letter>CHR(31)) AND (Letter<CHR(127))) THEN
BEGIN { Letters/Cijfers ? }
TEXT:=concat(TEXT,Letter); { Nieuwe letter erbij }
OutTextXY(x+CX*(Teller+6),y+CY,Letter);
END
ELSE IF ((Letter=CHR(13)) OR (Letter=CHR(10))) THEN
exit { RETURN = chr(13) }
ELSE IF Letter=CHR(8) THEN
BEGIN { Backspace = chr(8) }
IF Teller>2 THEN
BEGIN
Teller:=Teller-2; { backspace + voorganger = 2 chars !}
delete(TEXT,Teller+1,1); { verwijder laatste }
FixBar(x+CX*(Teller+7),y+CY,x+CX*(Teller+8),y+2*CY,
Yellow,Yellow);
SetColor(DarkGray);
END
ELSE
BEGIN
TEXT:=''; { Alles wissen !! }
Teller:=0; { = opnieuw invoeren }
FixBar(x+CX*(Teller+7),y+CY,x+CX*(Teller+8),y+2*CX,
Yellow,Yellow);
SetColor(DarkGray);
END;
END
ELSE
Letter:=ReadKey; { Ctrl-codes opvangen }
END;
END;
{*******************************************************************}
{************************* GFX-Procedures **************************}
{*******************************************************************}
{*******************************************************************}
{ OpenVGAScreen(); }
{ Deze procedure zal proberen een VGAScherm te openen (600x480) }
{ Tevens worden de gebruikte kleuren aangepast. }
{ Note: VGAHi wordt door HiSpeed Pascal (Amiga en Atari) en }
{ Turbo-Pascal (PC) simuleert/ondersteund !! }
{*******************************************************************}
{ PRE : De variabele VGAMode (boolean) moet geinitialiseerd }
{ zijn als globale variabele. }
{ POST : Als het VGA-scherm open is, is VGAMode=TRUE. }
{ Zoniet, dan is VGAMode=FALSE. }
{*******************************************************************}
PROCEDURE OpenVGAScreen;
VAR
GfxDriver, DriverMode, ErrorCode : INTEGER;
BEGIN
GfxDriver:=Detect; { Gfx mogelijk ? }
InitGraph(GfxDriver,DriverMode,''); { Gfx Init }
SetGraphMode(VGAHi); { Probeer VGA .. }
ErrorCode:=GraphResult; { VGA gelukt ?? }
IF ErrorCode=grOK THEN
VGAMode:=TRUE { VGA Gelukt... }
ELSE
VGAMode:=FALSE; { Niks geen VGA ! }
IF VGAMode=TRUE THEN
BEGIN
GetPalette(OldPalette); { Actieve Palette }
SetRGBPalette(Black ,0 ,0 ,0 ); { opslaan en }
SetRGBPalette(Blue ,0 ,0 ,63); { instellen voor }
SetRGBPalette(Green ,0 ,63,0 ); { correcte kleur- }
SetRGBPalette(Red ,63,0 ,0 ); { Palette. }
SetRGBPalette(Yellow ,63,63,0 ); { Ook voor Amiga, }
SetRGBPalette(White ,63,63,63); { Atari en PC !! }
SetRGBPalette(DarkGray,20,20,20); { HIGHSPEED PASCAL }
SetColor(Yellow);
OutTextXY(180,470,'(C) 1993 By Hans Luyten. A-Yeah!');
END;
END;
{*******************************************************************}
{ RestoreColors; }
{ Herstelt oude palette... (als het goed is...) }
{*******************************************************************}
{ PRE : OldPalette moet de oude palette bevatten. }
{ POST : Oude Palette actief. }
{*******************************************************************}
PROCEDURE RestoreColors;
BEGIN
SetAllPalette(OldPalette);
END;
{*******************************************************************}
{ DrawShadowBox(x,y,w,h); }
{ Tekent een Shadowed-box. }
{*******************************************************************}
{ PRE : VGAMode moet TRUE zijn (en dus geopend zijn!). }
{ POST : Box op het sherm met schaduw rand. }
{*******************************************************************}
PROCEDURE DrawShadowBox(x,y,w,h:INTEGER);
BEGIN
FixBar(x+3,y+3,x+w+3,y+h+3,DarkGray,DarkGray);
FixBar(x,y,x+w,y+h,Yellow,Yellow);
END;
{*******************************************************************}
{ DrawNodeBox(x,y); }
{ Tekent een NODE-Box voor de Linked-List. }
{*******************************************************************}
{ PRE : Heeft DrawShadowBox en VGAMode=TRUE nodig. }
{ POST : Een 3-delige box op het scherm. }
{*******************************************************************}
PROCEDURE DrawNodeBox(x,y: INTEGER);
VAR
Teller : INTEGER;
BEGIN
FOR Teller:=0 TO 2 DO
DrawShadowBox(x,y+(FormH+Dist)*Teller,FormW,FormH);
END;
{*******************************************************************}
{ DrawPointer(x,y); }
{ Tekent een NODE-pointer voor de Linked-List (PIJL). }
{*******************************************************************}
{ PRE : Heeft VGAMode=TRUE nodig. }
{ POST : Pijl van Node n^.Next naar Node n+1^.Naam. }
{*******************************************************************}
PROCEDURE DrawPointer(x,y : INTEGER);
BEGIN
y:=y+2*FormH+2*Dist+(FormH DIV 2);
x:=x+FormW-3*Dist;
SetColor(DarkGray);
SetFillStyle(SolidFill,DarkGray);
Circle(x,y,5); { Cirkeltje }
SetColor(DarkGray);
FloodFill(x-3,y,DarkGray); { gevuld .. }
Bar(x+4,y-2,x+5*Dist,y+2);
Bar(x+5*Dist,y+2,x+5*Dist+4,y-2*FormH-2*Dist);
Bar(x+5*Dist+4,y-2*FormH-2*Dist,x+7*Dist,y-2*FormH-2*Dist+4);
PieSlice(x+8*Dist+4,y-2*FormH-2*Dist+2,138,215,10);
END;
{*******************************************************************}
{ DrawMenu(x,y); }
{ Tekent option-menu (F1..F5). }
{*******************************************************************}
{ PRE : Heeft DrawShadowBox en VGAMode=TRUE nodig. }
{ POST : Een Menu-Box voor de opties. }
{*******************************************************************}
PROCEDURE DrawMenu(x,y : INTEGER);
BEGIN
DrawShadowBox(x,y,32*CX,17*CY);
SetColor(DarkGray);
OutTextXY(x+CX,y+CY,'Opties:');
OutTextXY(x+CX,y+3*CY, '1 Head Insertion Node');
OutTextXY(x+CX,y+5*CY, '2 Position Insertion Node');
OutTextXY(x+CX,y+7*CY, '3 Tail Insertion Node');
OutTextXY(x+CX,y+9*CY, '4 Remove Node');
OutTextXY(x+CX,y+11*CY,'5 Programma verlaten');
OutTextXY(x+CX,y+15*CY,'(Maximaal 5 Nodes toegestaan!)');
END;
{*******************************************************************}
{ DrawNodeIndex; }
{ Tekent de balk met daarin de node nummering. }
{*******************************************************************}
{ PRE : VGAMode moet TRUE zijn, en de procedure DrawShadowBox }
{ moet aanwezig zijn. }
{ POST : Een genummerde balk. }
{*******************************************************************}
PROCEDURE DrawNodeIndex;
BEGIN
DrawShadowBox(20,250,595,3*CX);
SetColor(DarkGray);
OutTextXY(20+CX ,250+CY,'[Nummer 1]');
OutTextXY(145+CX,250+CY,'[Nummer 2]');
OutTextXY(270+CX,250+CY,'[Nummer 3]');
OutTextXY(395+CX,250+CY,'[Nummer 4]');
OutTextXY(520+CX,250+CY,'[Nummer 5]');
END;
{*******************************************************************}
{********************* DynamicList-Procedures **********************}
{*******************************************************************}
{*******************************************************************}
{ EmptyList(StudentP); }
{ Kijkt of een DynamischeLijst LEEG is. Een lege lijst is een lijst }
{ waarvoor nog geen 'new()' is gebruikt. StudentP wijst dus naar NIL}
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ POST : De functie geeft TRUE als de lijst leeg is, FALSE als de }
{ lijst niet leeg is. }
{*******************************************************************}
FUNCTION EmptyList(Student : StudentP):BOOLEAN;
BEGIN
IF Student=NIL THEN
EmptyList:=TRUE { Head=NIL betekent: LEGE lijst }
ELSE
EmptyList:=FALSE;
END;
{*******************************************************************}
{ InputStudent(x,y,StudentP); }
{ Invoer van de data voor 'StudentP'. }
{*******************************************************************}
{ PRE : 'StudentP' moet geinitialiseerd zijn met new(). }
{ en VGAMode=TRUE. }
{ POST : 'StudentP' bevat de nieuwe data. }
{*******************************************************************}
PROCEDURE InputStudent(x,y : INTEGER;VAR Current : StudentP);
BEGIN
SetColor(Yellow);
DrawShadowBox(x-CX,y-CY,23*CX,7*CY);
SetColor(DarkGray);
OutTextXY(x,y,'Invoeren nieuwe node');
LeesInput(x,y+CY,'Naam:',Current^.Naam);
LeesInput(x,y+3*CY,'ANr :',Current^.ANr);
FixBar(x-Cx,y-3*CY,x+22*CX+Dist,y+6*CY+Dist,Black,Black);
END;
{*******************************************************************}
{ OutputStudent(x,y,StudentP); }
{ Weergave van de data die in de node 'StudentP' staat. }
{*******************************************************************}
{ PRE : 'StudentP' moet geinitialiseerd zijn met new() en mag niet }
{ leeg zijn. }
{ POST : De inhoud van StudentP op het scherm. }
{*******************************************************************}
PROCEDURE OutputStudent(x,y : INTEGER; Current : StudentP);
BEGIN
DrawNodeBox(x,y);
SetColor(DarkGray);
OutTextXY(x+CX,y+CY,Current^.Naam);
OutTextXY(x+CX,y+CY+FormH+Dist,Current^.ANr);
IF Current^.Next=NIL THEN
OutTextXY(x+CX,Y+CY+2*FormH+2*Dist,'NIL')
ELSE
DrawPointer(x,y);
END;
{*******************************************************************}
{ GotoEnd(StudentP); }
{ Maakt van 'StudentP' de pointer naar de laatste node. Let dus op! }
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ De lijst mag ook NIET leeg zijn ! }
{ POST : 'StudenP' wijst nu naar de LAATSTE node in de lijst. }
{*******************************************************************}
PROCEDURE GotoEnd(VAR Position : StudentP);
BEGIN
WHILE Position^.Next<>NIL DO { Laatste Node wijst naar NIL }
Position:=Position^.Next;
END;
{*******************************************************************}
{ GotoNodeNr(n,StudentP); }
{ Maakt van 'StudentP' de pointer naar de n-de node. Let dus op! }
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ De lijst mag ook NIET leeg zijn ! }
{ POST : 'StudenP' wijst nu naar de n-de node in de lijst. }
{*******************************************************************}
PROCEDURE GotoNodeNr(n : INTEGER; VAR Position : StudentP);
VAR
Teller : INTEGER;
Temp : StudentP;
BEGIN
Position:=StudentHead;
FOR Teller:=2 TO n DO { StudentHead is global 1e node !! }
BEGIN
IF Position^.Next<>NIL THEN { Laatste Node wijst naar NIL !! }
Position:=Position^.Next;
END;
END;
{*******************************************************************}
{ HeadInsert(x,y,StudentP); }
{ Initialiseerd indien nodig de lijst en voegt aan de kop van de }
{ lijst een nieuwe node toe. }
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ POST : De lijst is 1 node langer geworden, aan de kop ! }
{*******************************************************************}
PROCEDURE HeadInsert(x,y : INTEGER; VAR Head : StudentP);
VAR
Node : StudentP;
Empty : BOOLEAN;
BEGIN
Empty:=EmptyList(Head); { Kijk of de lijst leeg is }
IF Empty THEN
BEGIN
NEW(Head); { Lege lijst wordt geinitialiseerd }
Node:=Head; { Nieuw node = head, bij lege lijst}
END
ELSE
NEW(Node); { Er wordt een 'node' toegevoegd }
InputStudent(x,y,Node); { Invoer data van de node }
IF Empty THEN
Node^.Next:=NIL
ELSE
BEGIN
Node^.Next:=Head; { Vooraan schuiven van de node }
Head:=Node;
END;
END;
{*******************************************************************}
{ PositionInsert(x,y,StudentP); }
{ Initialiseerd indien nodig de lijst en plaatst op POS een nieuwe }
{ node in de lijst. Doet OOK position insert als: -de lijst leeg is }
{ -Maar 1 node heeft}
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ POST : De lijst is 1 node langer geworden. }
{*******************************************************************}
PROCEDURE PositionInsert(x,y : INTEGER; VAR Head : StudentP);
VAR
Node : StudentP;
Position : StudentP;
Empty : BOOLEAN;
Invoer : string[15];
Nr : INTEGER;
BEGIN
Empty:=EmptyList(Head); { Kijk of de lijst leeg is }
IF Empty THEN
BEGIN
NEW(Head); { Lege lijst wordt geinitialiseerd }
Node:=Head; { Nieuw node = head, bij lege lijst}
Node^.Next:=NIL; { eerste en laatse Node }
END
ELSE IF ActiveNodes<2 THEN
BEGIN
NEW(Node);
Head^.Next:=Node;
Node^.Next:=NIL;
END
ELSE IF ActiveNodes>1 THEN
BEGIN
NEW(Node); { Er wordt een 'node' toegevoegd }
Position:=Head;
Invoer:='Positie nummer [1-';
Invoer:=ConCat(Invoer,CHR(48+ActiveNodes),']: ');
REPEAT { Read 1-ActiveNodes (max=5) }
SetColor(Yellow);
SetFillStyle(SolidFill,Yellow);
DrawShadowBox(x-CX,y-CY,23*CX,3*CY);
SetColor(DarkGray);
OutTextXY(x,y,Invoer);
c:=readKey;
UNTIL ((c>#48)AND(c<CHR(48+ActiveNodes+1)));
Nr:=ORD(c)-48;
GotoNodeNr(Nr-1,Position); { Add after n-1 }
END;
InputStudent(x,y,Node); { Invoer data van de node }
IF (NOT(Empty)AND(ActiveNodes>1)) THEN
BEGIN
Node^.Next:=Position^.Next;
Position^.Next:=Node;
END
ELSE IF Empty THEN
Head:=Node;
END;
{*******************************************************************}
{ TailInsert(x,y,StudentP); }
{ Initialiseerd indien nodig de lijst en voegt aan de staart van de }
{ lijst een nieuwe node toe. }
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ POST : De lijst is 1 node langer geworden, aan de staart ! }
{*******************************************************************}
PROCEDURE TailInsert(x,y : INTEGER; VAR Head : StudentP);
VAR
Node : StudentP;
Tail : StudentP;
Empty : BOOLEAN;
BEGIN
Empty:=EmptyList(Head); { Kijk of de lijst leeg is }
IF Empty THEN
BEGIN
NEW(Head); { Lege lijst wordt geinitialiseerd }
Node:=Head; { Nieuw node = head, bij lege lijst}
END
ELSE
BEGIN
NEW(Node); { Er wordt een 'node' toegevoegd }
Tail:=Head;
GotoEnd(Tail);
END;
InputStudent(x,y,Node); { Invoer data van de node }
Node^.Next:=NIL;
IF NOT(Empty) THEN
Tail^.Next:=Node { Achteraan schuiven van de node }
ELSE
Head:=Node;
END;
{*******************************************************************}
{ ShowList(x,y,StudentP); }
{ Laat alle nodes in een lijst zien, te beginnen bij de node die }
{ als parameter gegeven wordt (studentP). }
{*******************************************************************}
{ PRE : Type 'StudentP' moet gedefinieerd zijn. }
{ POST : Als de lijst niet leeg is, is de hele lijst zichtbaar }
{ vanaf 'StudentP'. }
{*******************************************************************}
PROCEDURE ShowList(x,y : INTEGER;Head : StudentP);
BEGIN
IF NOT(EmptyList(Head)) THEN
BEGIN
OutputStudent(x,y,Head);
x:=x+FormW+6*Dist;
ShowList(x,y,Head^.Next); { recursion }
END;
END;
{*******************************************************************}
{ DeleteNode(x,y); }
{ Verwijderd een node, nummer wordt afgevraagd. }
{*******************************************************************}
{ PRE : Er moet minstens 1 node in de list staan. }
{ POST : 1 element minder in de list. }
{*******************************************************************}
PROCEDURE DeleteNode(x,y : INTEGER);
VAR
Nr : INTEGER;
Position : StudentP;
BadNode : StudentP;
Invoer : string[35];
BEGIN
Position:=StudentHead;
IF StudentHead^.Next=NIL THEN
DISPOSE(StudentHead)
ELSE
BEGIN
Invoer:='Verwijder Positie nummer [1-';
Invoer:=ConCat(Invoer,CHR(48+ActiveNodes),']: ');
REPEAT { Read 1-ActiveNodes (max=5) }
SetColor(Yellow);
SetFillStyle(SolidFill,Yellow);
DrawShadowBox(x-CX,y-CY,36*CX,3*CY);
SetColor(DarkGray);
OutTextXY(x,y,Invoer);
c:=readKey;
UNTIL ((c>#48)AND(c<=CHR(48+ActiveNodes+1)));
Nr:=ORD(c)-48; { pos 2 = insert NA pos 1 }
IF Nr>1 THEN
BEGIN
GotoNodeNr(Nr-1,Position);
BadNode:=Position^.Next;
Position^.Next:=BadNode^.Next; { Wipe Node }
DISPOSE(BadNode); { free memory }
END
ELSE
BEGIN
BadNode:=StudentHead;
StudentHead:=BadNode^.Next;
DISPOSE(BadNode);
END;
END;
FixBar(x-CX,y-CY,x+36*CX+Dist,y+4*CY,Black,Black);
END;
{*******************************************************************}
{ ClearList; }
{ Verwijderd de LinkedList uit het geheugen, reserved memory komt }
{ nu vrij voor andere toepassingen. }
{*******************************************************************}
{ PRE : De globale variable STUDENTHEAD moet bestaan. }
{ POST : Een lege lijst. }
{*******************************************************************}
PROCEDURE ClearList;
VAR
Temp : StudentP;
BEGIN
WHILE NOT(EmptyList(StudentHead)) DO
BEGIN
Temp:=StudentHead^.Next;
DISPOSE(StudentHead);
StudentHead:=Temp;
END;
END;
{*******************************************************************}
{ ReadMenuKeys; }
{ Leest het toetsenbord voor de menu opties. }
{*******************************************************************}
{ PRE : Werkt met HeadInsert, PositionInsert, TailInsert en }
{ ShowList, deze moeten dus aanwezig zijn. }
{ POST : - }
{*******************************************************************}
PROCEDURE ReadMenuKeys;
BEGIN
REPEAT
c:=ReadKey;
CASE c OF
'1' : BEGIN
IF ActiveNodes<MaxNodes THEN
BEGIN
HeadInsert(20,80,StudentHead); { 1 }
ShowList(20,300,StudentHead);
ActiveNodes:=SUCC(ActiveNodes);
END;
END;
'2' : BEGIN
IF ActiveNodes<MaxNodes THEN
BEGIN
PositionInsert(20,80,StudentHead); { 2 }
ShowList(20,300,StudentHead);
ActiveNodes:=SUCC(ActiveNodes);
END;
END;
'3' : BEGIN
IF ActiveNodes<MaxNodes THEN
BEGIN
TailInsert(20,80,StudentHead); { 3 }
ActiveNodes:=SUCC(ActiveNodes);
ShowList(20,300,StudentHead);
END
END;
'4' : BEGIN
IF ActiveNodes>1 THEN
BEGIN
DeleteNode(20,80); { 4 }
FixBar(20,300,650,450,Black,Black);
ActiveNodes:=PRED(ActiveNodes);
END
ELSE
BEGIN
ClearList;
StudentHead:=NIL;
FixBar(20,300,599,400,Black,Black);
ActiveNodes:=0;
END;
ShowList(20,300,StudentHead);
END;
'5' : exit; { 5 }
END;
UNTIL FALSE;
END;
{*******************************************************************}
{******************************* MAIN ******************************}
{*******************************************************************}
BEGIN
ActiveNodes:=0;
StudentHead:=NIL; { Nog lege lijst }
OpenVGAScreen; { VGAHi openen }
IF VGAMode THEN { VGAHi is nodig! }
BEGIN
DrawNodeIndex; { Node nummering }
DrawMenu(380,72); { Menu tekenen }
ReadMenuKeys; { Menu afwachten }
RestoreColors; { Herstel kleuren }
CloseGraph; { VGAHi Sluiten }
ClearList; { Release memory }
END;
END. { doei ! }